import { Minimatch } from 'minimatch'
import { GlobOptions } from './glob.js'

/**
 * Return true if the patterns provided contain any magic glob characters,
 * given the options provided.
 *
 * Brace expansion is not considered "magic" unless the `magicalBraces` option
 * is set, as brace expansion just turns one string into an array of strings.
 * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and
 * `'xby'` both do not contain any magic glob characters, and it's treated the
 * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`
 * is in the options, brace expansion _is_ treated as a pattern having magic.
 */
export const hasMagic = (
  pattern: string | string[],
  options: GlobOptions = {},
): boolean => {
  if (!Array.isArray(pattern)) {
    pattern = [pattern]
  }
  for (const p of pattern) {
    if (new Minimatch(p, options).hasMagic()) return true
  }
  return false
}
